/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package analiseSintatica.Regras.Expressoes;

import analiseSintatica.Regras.*;
import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import analiseSemantica.ErroSemantico;
import analiseSemantica.Tipos.TiposSemanticos;
import analiseSintatica.AnalisadorSintatico;
import analiseSintatica.ErroSintaticoException;
import java.util.LinkedList;

/**
 *
 * @author linton
 */
public class RegraLogicaE extends Regra{

    protected static Regra instancia;

    RegraIgualdade regraIgualdade = RegraIgualdade.getInstance();
    protected String estrutura = "<igualdade> {'&&'<igualdade>}";


    /**
     * Construtor privado necessario ao singleton
     */
    private RegraLogicaE() {
    }

    /**
     * Retorna a unica instancia dessa classe.
     * @return
     */
    public static RegraLogicaE getInstance() {
        if (instancia == null) {
            instancia = new RegraLogicaE();
        }
        return (RegraLogicaE) instancia;
    }

    

    @Override
    public TiposSemanticos analisar(LinkedList<LinkToken> listaTokens) throws ErroSintaticoException {

            TiposSemanticos tipoReturn = new TiposSemanticos();
            TiposSemanticos tipos1 = RegraIgualdade.getInstance().analisar(listaTokens);

           tipoReturn = tipos1;

            while(listaTokens.getFirst().getLexema().equals("&&")){

                reconheceLexema(listaTokens, "operador_logico", "&&", estrutura);
                TiposSemanticos tipos2 = RegraIgualdade.getInstance().analisar(listaTokens);

                if(tipoReturn != null && tipos2 != null){
	                int linha = tipos2.getFirst().getLinha();
	                if(!tipos2.getFirst().getNomeTipo().equals("boolean")||
	                        !tipoReturn.getFirst().getNomeTipo().equals("boolean")){
	                	AnalisadorSintatico.errosemanticos.add(new ErroSemantico("Expressao deve ser booleana",linha));
	                  tipoReturn =  null;
	                }
                 }else{
                	 tipoReturn = null;
                 }

            }

        
            return tipoReturn ;//retorna tipo boolean se der certo
    }

    @Override
    protected void setPrimeiro() {
        this.primeiro = RegraIgualdade.getInstance().getPrimeiro();
    }
}
